package com.bestcem.xm.award.dao;


import com.bestcem.xm.award.entity.pojo.AwardHistoryDO;
import com.bestcem.xm.award.entity.pojo.DeliverDetailDO;
import com.bestcem.xm.award.entity.pojo.RedPacketStatsDO;
import com.bestcem.xm.award.grpc.service.param.redpacket.WinDetailListParam;

import java.util.List;


public interface AwardHistoryDao {

    int insertSelective(AwardHistoryDO awardHistoryDO);

    int updateByPrimaryKeySelective(AwardHistoryDO awardHistoryDO);

    /**
     * 根据awardId查询投放名称
     *
     * @param awardId 奖励id
     * @return
     */
    List<String> getDeliverNameList(String awardId);

    /**
     * 获取中奖人数
     *
     * @param awardId 奖励id
     * @return
     */
    long getWinCount(String awardId);

    /**
     * 尝试领取概率红包次数
     *
     * @param awardId 奖励id
     * @return
     */
    long getTryDrawCount(String awardId);

    /**
     * 查询红包 已发送条数和已发送金额
     *
     * @param awardId 奖励id
     * @return
     */
    RedPacketStatsDO getSendAmountAndCount(String awardId);


    /**
     * 查询投放 已发送条数和已发送金额
     *
     * @param awardId 奖励id
     * @return
     */
    List<DeliverDetailDO> getDeliverDetail(String awardId);

    /**
     * 根据奖励id 状态获取匹配数量
     *
     * @param awardId    奖励id
     * @param statusList 奖励状态
     * @return 匹配数量
     */
    long countByIdAndStatus(String awardId, List<Integer> statusList);

    /**
     * 统计中奖明细条数
     *
     * @param param 参数
     * @return 明细列表
     */
    long getWinDetailListCount(WinDetailListParam param);

    /**
     * 查询中奖明细列表
     *
     * @param param 参数
     * @return 明细列表
     */
    List<AwardHistoryDO> getWinDetailList(WinDetailListParam param);

    /**
     * 统计领取次数,根据奖励id、openId、状态不为 请求通过 的数量
     *
     * @param awardId 奖励id
     * @param openId  openId
     * @return 匹配数量
     */
    long countByIdAndOpenIdAndNotPass(String awardId, String openId);

//    /**
//     * 根据 awardid、deliverId、requestID查询hsitory,如果没有就插入一条记录openId,deliverName、deliverChannel、seq
//     * 拆成findByRequest 和insertSelective，但是需要设值
//     * @param request        查询参数
//     * @param openId         openId
//     * @param deliverName    投放名称
//     * @param deliverChannel 投放渠道
//     * @return 更新前的记录
//     */
//    AwardHistoryDO findAndSave(AwardRequest request, String openId, String deliverName, Integer deliverChannel);

    /**
     * 通过请求参数查询是否请求过
     *
     * @param awardId
     * @param deliverId
     * @param requestId
     * @return
     */
    AwardHistoryDO findByRequest(String awardId, String deliverId, String requestId);

    /**
     * 查询记录
     *
     * @param awardId   红包id
     * @param requestId
     * @param status    领取状态
     * @return 更新前的记录
     */
    AwardHistoryDO findOneByAwardIdAndRequestIdAndStatus(String awardId, String requestId, Integer status);


//    /**
//     * 根据id查找记录，然后同时更新status,返回更新前的数据
//     * 改为，先根据id更新status，更新完再根据id查询
//     * @param id           id
//     * @param updateStatus 红包状态
//     * @return 更新前的记录
//     */
//    AwardHistoryDO updateStatusById(String id, RedPacketStatusEnum updateStatus);


//    /**
//     * 根据id查找记录，然后同时更新status ,改用updateByKeySelective
//     *
//     * @param id           id
//     * @param updateStatus 红包状态
//     * @param sendTime     发送时间
//     * @return 更新结果
//     */
//    int updateStatusAndSendTimeById(String id, RedPacketStatusEnum updateStatus, Date sendTime);


//    /**
//     * 领取红包后，更新orderId、中奖金额、发送时间,改用updateByKeySelective
//     *
//     * @param id           id
//     * @param orderId      订单id也就是seq
//     * @param amount       红包金额单位分
//     * @param updateStatus 红包状态
//     * @param sendTime     发送时间
//     * @return 更新结果
//     */
//    int updateWinInfoById(String id, String orderId, Integer amount, RedPacketStatusEnum updateStatus, Date sendTime);

    /**
     * 红包发送中状态更新，60s后再次查询更新状态，更新status、中奖金额
     *
     * @param awardId 奖励id
     * @param orderId 订单id也就是seq
     * @param amount  红包金额单位分
     * @param status  红包状态
     * @return 更新结果
     */
    int updateWinInfoByAwardIdAndOrderId(String awardId, String orderId, Integer amount, Integer status);


}